
from functools import partial

from PySide6.QtGui import QAction
from PySide6.QtWidgets import QGraphicsSceneMouseEvent, QMenu, QGraphicsTextItem

from 程序核心代码.mvvm重构.基础定义.基础图形项.基础图形组件.子组件.通用基类.模型定义 import 组件模型基类, 组件节点图形项基类


class 下拉列表组件模型(组件模型基类):
    def __init__(self ,选项列表,当前选项=None):
        super().__init__("下拉列表组件",选项列表=选项列表,当前选项=当前选项)






class 下拉列表组件图形项(组件节点图形项基类):
    def __init__(self,模型):
        super().__init__(模型)
    def 组件初始化(self):
        self.组件=下拉列表项(self.图形项属性.get("选项列表"),self.图形修改选项)
        self.注册属性触发函数("选项列表", self.更新选项列表)
        self.注册属性触发函数("当前选项", self.更改当前选中)
    def 更新选项列表(self):
        self.组件.更新选项列表(self.图形项属性.get("选项列表"))
    def 更改当前选中(self):
        self.组件.更改当前选中(self.图形项属性.get("当前选项"))
    def 图形修改选项(self, 选项):
        self.设置图形项属性("当前选项",选项)



class 下拉列表项(QGraphicsTextItem):
    def __init__(self,选项列表,当前选中修改回调函数):
        super().__init__()
        self.setPlainText("初始")
        self.选项列表 = 选项列表  # 使用普通的 Python 列表存储选项
        self.当前选中修改回调函数 = 当前选中修改回调函数

        # 设置下拉列表项的属性
        #起始接口.setTextInteractionFlags(Qt.TextEditorInteraction)
        self.setZValue(100)  # 提高 Z 值，确保菜单弹出时不被遮挡
        self.setAcceptHoverEvents(True)  # 接受鼠标悬停事件

        self.menu = None  # 用于存储 QMenu 实例

    def mousePressEvent(self, 事件: QGraphicsSceneMouseEvent):
        """鼠标按下事件，触发菜单弹出"""
        #print("菜单项鼠标按下，显示菜单")
        self.选项菜单(事件)  # 使用 scenePos() 获取场景中的位置
        super().mousePressEvent(事件)

    def 选项菜单(self, 事件):
        """显示自定义菜单"""
        if self.menu:
            self.menu.close()  # 关闭已有的菜单，避免重复显示
        self.menu = QMenu()  # 创建新的菜单

        # 添加选项到菜单
        for 选项 in self.选项列表:
            action = QAction(选项, self)
            action.triggered.connect(partial(self.选项被选中, 选项))
            self.menu.addAction(action)
        鼠标位置 = 事件.screenPos() # 在场景坐标系中弹出菜单
        self.menu.exec_(鼠标位置)  # 在指定位置弹出菜单
    def 选项被选中(self, 选项):
        """选项被选中时触发的函数"""
        self.当前选中修改回调函数(选项)
        self.更改当前选中(选项)

    def 更改当前选中(self, 选项):
        """更改当前选中的选项"""
        #起始接口.setPlainText("属性名: "+str(选项))
        self.setPlainText(str(选项))

    def 更新选项列表(self, 新选项列表):
        """更改整个选项列表"""
        self.选项列表 = 新选项列表  # 直接替换选项列表

    def 添加选项(self, 新选项):
        """向选项列表中添加一个新的选项"""
        self.选项列表.append(新选项)  # 向选项列表添加新选项
        print(f"添加选项: {新选项}")

